

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;

public class Simulation {
	// class contenant les parametres de simulation

	public Simulation(Interface_graphique ie){ // Simulation avec l'interface graphique

		ie.affiche_fenetre();
		this.launch_simulation();
		ie.dispose();
	}

	public Simulation(Interface_graphique ie, char choix){ // Simulation avec l'interface graphique

		ie.affiche_fenetre();

		switch (choix) {

		case 'c': // test de cdma

			this.simu_collision(Utils.cdmamax);
			
			break;
		default:
			System.out.println("Aucun choix  !");
			break;
		}
		ie.dispose();
	}
//========================================================================================
	public void simu_collision(int cdma){ // simulation graphs pour CDMA  
		
		int compteur_simu = 0;
		//Utils.cdmamax=cdma;
		int cdma_tmp = 1;
		
		while (cdma_tmp <= cdma) {
		//for(int i=0;i<cdma; i=i+2) {	// de 2 en 2
			
			System.out.println("Starting simu "+ compteur_simu);
			compteur_simu++;

			Utils.nb_demande_acces = 0;	// reset
			Utils.total_collisions = 0;
			Statistique.nb_clients_actif = Statistique.nb_clients_contention = Statistique.nb_clients_inactif = 0;
			
			Utils.cdmamax = cdma_tmp;	// nouvelle valeur de cdma
			this.launch_simulation();
			//---------------------------------------------------------
			try {Utils.writeF(Utils.cdmamax+";"+Utils.total_collisions, "collisions_cdma");} // STAT
			catch (IOException e) {e.printStackTrace();}
			
			//try {Utils.writeF(Utils.cdmamax+";"+Utils.nb_demande_acces/Utils.nb_rejets , "probabilite_rejet");} // STAT
			//catch (IOException e) {e.printStackTrace();}
			if (Utils.total_collisions == 0) Utils.total_collisions=1;
			if (Utils.nb_rejets ==0) Utils.nb_rejets = 1;
			if (Statistique.nb_clients_actif ==0) Statistique.nb_clients_actif = 1;
			
			try {Utils.writeF(Utils.cdmamax
					+";"+(Utils.total_collisions*100/Utils.nb_demande_acces)			// Connexions avec collision
					+";"+(Utils.nb_rejets*100/Utils.nb_demande_acces)					// Connexions avec rejet
					+";"+(Statistique.nb_clients_actif*100/Utils.nb_demande_acces)    	// Demandes d'access (il faudrait connexions acceptées...)			
					,"CDMA_proba_col-reject-accept");} 	// Nom du fichier
			catch (IOException e) {e.printStackTrace();}
			
			System.out.println(";"+(Utils.total_collisions*100/Utils.nb_demande_acces)			// Connexions avec collision
					+";"+(Utils.nb_rejets*100/Utils.nb_demande_acces)					// Connexions avec rejet
					+";"+(Statistique.nb_clients_actif*100/Utils.nb_demande_acces) );
			System.out.println(";"+(Utils.total_collisions)			// Connexions avec collision
					+";"+(Utils.nb_rejets)					// Connexions avec rejet
					+";"+(Statistique.nb_clients_actif) 
					+";"+(Utils.nb_demande_acces) );
			
			//---------------------------------------------------------
			System.out.println("Simu "+ compteur_simu+ " Ended...");
			
			cdma_tmp = cdma_tmp+2;	// incrément
		}
		System.out.println("Simulations terminées");
		try {Utils.writeF("Simulations ended","console");} catch (IOException e) {e.printStackTrace();}
	}
	//========================================================================================
	public void default_parameter(){ // si pas d'interface graphique, on init les valeurs par défault

		Utils.cdmamax=6;	// Valeurs par défaut si pas d'IHM
		Utils.nb_client=15;
		Utils.nb_tr=50;	// nb de trames
		Utils.wmax=16;
		Utils.nb_freq=16; // nb de fréquence de la trame 
	}
//========================================================================================
	public void launch_simulation(){

		ArrayList<Client> client_liste ;		// Crée la liste des clients

		client_liste = Utils.make_client(Utils.nb_client); 	// creation des clients avec nb client en parametre ;

		Trame global_trame; 					// trame globale accessible a tous 
		Statistique stat1= new Statistique();


		Iterator it ;
		boolean init_client_done=false;

		Station_Base sb = new Station_Base(); 	// nouvelle station de base 
		global_trame = sb.send_trame(); 		// la station de base envoie la trame 


		for ( int t = 0; t<Utils.nb_tr; t++) { //nb trames
			
			if (Utils.log==1)
				try {Utils.writeF("+++++++++++++++++++++++++++++++++++++++Trame " +t+ "+++++++++++++++++++++++++++++++++++" , "console");} 
				catch (IOException e) {e.printStackTrace();}
				////System.out.println("+++++++++++++++++++++++++++++++++++++++Trame " +t+ "+++++++++++++++++++++++++++++++++++");


			for (int s=0; s<48; s++) { //nb slot
				
				if (Utils.log==1)
					try {Utils.writeF("----------------------------------Slot " +s+ "----"+"trame " +t+"----------------------------" , "console");} 
					catch (IOException e) {e.printStackTrace();}
					//System.out.println("----------------------------------Slot " +s+ "----"+"trame " +t+"----------------------------");

				it =  client_liste.iterator();
				while(it.hasNext()){ // parcour des clients 
					Client client = (Client) it.next();

					// Actions clients 
					client.comportement(global_trame, s, t);// s est le num de slot, t est le num de trame
				}

				//System.out.println("FCH -----------> "+ global_trame.get_FCH().toString());

				if (Utils.log==1)
			try {Utils.writeF("Curseur "+ Utils.pos_curseur , "console");} 
				catch (IOException e) {e.printStackTrace();}
				////System.out.println("Curseur "+ Utils.pos_curseur);
				if (Utils.log==1)
			try {Utils.writeF("DL_MAP : " + global_trame.get_DL_map().toString()+"|" , "console");} 
				catch (IOException e) {e.printStackTrace();}
				////System.out.println("DL_MAP : " + global_trame.get_DL_map().toString()+"|");	

				Utils.slot_emission.clear(); // clear le tab pour listen canal

				Utils.get_collisions(); // on get les collisions par slot 

				Utils.emissions_client.clear();

			} // fin du slot

			sb.raz_dl_ul_map_fch(global_trame);
			sb.traitement_trame(global_trame);
			Utils.collision_by_trame.clear();

			sb.raz_ranging_sub_channel(global_trame);

		}	// fin de la trame

		// affichage statistiques

		if (Utils.log==1)
			try {Utils.writeF("client liste "+client_liste.size() , "console");} 
		catch (IOException e) {e.printStackTrace();}
		////System.out.println("client liste "+client_liste.size());

		stat1.add_clients_statistique(client_liste);

		if (Utils.log==1)
			try {Utils.writeF("******* Data send/received per client********" , "console");} 
		catch (IOException e) {e.printStackTrace();}
		////System.out.println("******* Data send/received per client********");
		stat1.display_clients_show_data();
	}

}
